package chaoyue.study.reflect;

/**
 * 通过反射机制可以直接操作字节码文件（class文件）
 * 反射机制一般都是用来做框架的
 */
public class Test01 {
    /*
    通过三种方式可以获取类的字节码
     */
    public static void main(String[] args) throws ClassNotFoundException {
        /*
        方式一 使用 Class.forName() 来获取字节码文件，并封装到Class对象中
        这种方式用于在没有对象，只知道全限定类名的时候去获取字节码文件
            1.静态方法
            2.方法的参数是一个字符串
            3.字符串需要的是一个完整的类名（全限定类名）包括java.lang也不能省略
         */
        Class c1 = Class.forName("java.lang.String");
        System.out.println(c1);
        /*
        方式二 使用 getClass() 获取这个实例对应类的字节码文件
        getClass()方法是Object类中的，所以所有的类都有这个方法
        这种方式适合在已经获取到了对象的时候去获取字节码文件
         */
        Class c2 = new String().getClass();
        System.out.println(c2);
        // 注意：c1和c2的内存地址是一样的
        // 因为同一个类的字节码文件在方法区中只有一份 Class对象的地址是直接指向方法区中字节码文件的地址
        System.out.println(c1 == c2);

        /*
        方式三 使用类型中自带的属性(基本属性类型也可以使用)
         */
        Class c3 = Integer.class;
        Class c4 = int.class;
        // 基本类型和包装类型对应的class是不同的
        System.out.println(c3 == c4);
        System.out.println(c4.getName());
        System.out.println(c4.getSimpleName());
    }
}
